<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
		// 函数对象
		var f1 = function() {}
		var f2 = new Function()
		function f3 () {}

		// 普通对象
		var o1 = {}
		var o2 = new Object()
		var o3 = new f3()
		
		// 函数类型 
		// Number String Boolean Array
		console.log(typeof Object)
		console.log(typeof Function)

		// function
		console.log(typeof f1)
		console.log(typeof f2)
		console.log(typeof f3)

		console.dir( f1)
		console.dir( f2)
		console.dir( f3)


		// object 
		console.log(typeof o1)
		console.log(typeof o2)
		console.log(typeof o3)

		console.dir( o1)
		console.dir( o2)
		console.dir( o3)

		// 原型对象
		
		// 函数对象 
		// 	prototype
		// 	__proto__
		 	
		// 普通对象
		// 	__proto__

		// 原型主要用来继承
		var person = function(name = 'ken') {
			this.name = name;
		}

		// 使用prototype来添加对象的属性和方法
		// person.prototype.getName = function() {
		// 	return this.name
		// }
		// person.prototype.getMoney = function() {
		// 	return this.money
		// }
		// person.prototype.money = '10000'

		person.prototype = {
			money:'10000',
			getName:function() {
				return this.name
			},
			getMoney:function() {
				return this.money
			}
		}
		var zjh = new person('zjh') // 实例化
		console.dir(zjh)
		console.log(zjh.name)
		console.log(zjh.money)
		console.log(zjh.getName())
		console.log(zjh.getMoney())

		// 普通对象的内置属性proto，用于指向创建它的函数对象的原型对象prototype
		console.log(zjh.__proto__ === person.prototype)
		console.log(person.prototype.__proto__ === Object.prototype)
		console.log(Object.prototype.__proto__ === null)
		// 原型链
		// zjh.__proto__.__proto__.__proto__ === null
		// zjh->person->Object->null

		// person
		console.log(person.__proto__ === Function.prototype)
		console.log(Function.prototype.__proto__ === Object.prototype)
		console.log(Object.prototype.__proto__ === null)
		// person->Function->Object->null

		// Function 
		console.log(Function.__proto__ === Function.prototype)
		console.log(Function.prototype.__proto__ === Object.prototype)
		console.log(Object.prototype.__proto__ === null)
		// Function->Function->Object->null
		
		// Object
		console.log(Object.__proto__ === Function.prototype)
		console.log(Function.prototype.__proto__ === Object.prototype)
		console.log(Object.prototype.__proto__ === null)

		// Object->Function->Object->null
		
		// js 里面 null->对象->函数对象->普通对象
		
	</script>
</body>
</html>